package middleware

import (
	"bp/internal/util"
	"context"
	"go.uber.org/zap"
	"google.golang.org/grpc"
	"google.golang.org/grpc/metadata"
)

func injectPager(ctx context.Context, md metadata.MD) context.Context {
	var pageSizeStr, pageNoStr, tsStr string

	pageSizeValues := md.Get(util.PageSizeKey)
	if len(pageSizeValues) > 0 {
		pageSizeStr = pageSizeValues[0]
	}
	pageNoValues := md.Get(util.PageNoKey)
	if len(pageNoValues) > 0 {
		pageNoStr = pageNoValues[0]
	}
	tsValues := md.Get(util.TsKey)
	if len(tsValues) > 0 {
		tsStr = tsValues[0]
	}

	if util.IsEmpty(pageSizeStr) && util.IsEmpty(pageNoStr) && util.IsEmpty(tsStr) {
		return ctx
	}

	pagerPtr := util.ParsePager(pageSizeStr, pageNoStr, tsStr)
	return context.WithValue(ctx, util.PagerKey{}, pagerPtr)
}

// UnaryPagerInterceptor add pager
func UnaryPagerInterceptor(slog *zap.SugaredLogger, decider util.ServerInterceptorDecider) grpc.UnaryServerInterceptor {
	return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) {
		if decider(ctx, info.FullMethod, info.Server) {
			md, ok := metadata.FromIncomingContext(ctx)
			if ok {
				ctx = injectPager(ctx, md)
			}
		}
		return handler(ctx, req)
	}
}
